home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / smaltalk / st80_pr4.lha / st80_pre4 / Foible / SDS / SDS-Equations.st < prev    next >
Text File  |  1993-07-24  |  63KB  |  2,597 lines

  1. TextController subclass: #MyTextController
  2.     instanceVariableNames: ''
  3.     classVariableNames: ''
  4.     poolDictionaries: ''
  5.     category: 'SDS-Equations'!
  6. MyTextController comment:
  7. 'I am a text controller for CodeView in EquationView. I am a subclass of TextController, and the difference between me and TextController is that I have a direct access to startBlock and stopBlock  and  can change set the initialText using a method : textHasChanged.'!
  8.  
  9.  
  10. !MyTextController methodsFor: 'accessing'!
  11.  
  12. startBlock
  13.     ^startBlock.!
  14.  
  15. stopBlock
  16.     ^stopBlock.!
  17.  
  18. textHasChanged
  19.     initialText _ self text.
  20.     ^false! !
  21.  
  22. Object subclass: #GraphListMenu
  23.     instanceVariableNames: ''
  24.     classVariableNames: ''
  25.     poolDictionaries: ''
  26.     category: 'SDS-Equations'!
  27. GraphListMenu comment:
  28. 'This is a PopUpMenu for Graphs. It is not used in our current version anymore'!
  29.  
  30. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  31.  
  32. GraphListMenu class
  33.     instanceVariableNames: ''!
  34.  
  35.  
  36. !GraphListMenu class methodsFor: 'examples'!
  37.  
  38. example
  39.     "GraphListMenu example"
  40.  
  41.     | entityA entityB anOCEntity |
  42.     EquationEditor initialize.
  43.     EquationParser initializeFunctionDict: EquationEditor functionDictionary.
  44.     entityA _ Entity withName: 'One' asSymbol.
  45.     entityB _ Entity withName: 'Two' asSymbol.
  46.     entityA add: entityA.
  47.     entityA add: entityB.
  48.     entityB add: entityA.
  49.     anOCEntity _ OrderedCollection new.
  50.     anOCEntity add: entityA; add: entityB.
  51.     GraphListMenu withBoxes: anOCEntity! !
  52.  
  53. !GraphListMenu class methodsFor: 'accessing'!
  54.  
  55. withBoxes: anOCBoxes 
  56.     | selectorCollection chosenSelector boxDictionary |
  57.     boxDictionary _ Dictionary new.
  58.     anOCBoxes do: [:box | boxDictionary at: box name asSymbol put: box].
  59.     (selectorCollection _ boxDictionary keys asSortedCollection) size = 0 ifTrue: [^self].
  60.     chosenSelector _ (PopUpMenu labelList: (Array with: selectorCollection)) startUp.
  61.     chosenSelector _ chosenSelector = 0
  62.                 ifTrue: [nil]
  63.                 ifFalse: [selectorCollection at: chosenSelector].
  64.     chosenSelector isNil ifFalse: [(self confirm: 'Delete ' , chosenSelector asString , ' from graph list ?')
  65.             ifTrue: ["action"
  66.                 anOCBoxes remove: (boxDictionary at: chosenSelector)
  67.                     ifAbsent: [^self]]]! !
  68.  
  69. Object subclass: #EquationParserErrorHandler
  70.     instanceVariableNames: ''
  71.     classVariableNames: ''
  72.     poolDictionaries: ''
  73.     category: 'SDS-Equations'!
  74. EquationParserErrorHandler comment:
  75. 'I am used by EquationParser to notify errors in parsing'!
  76.  
  77.  
  78. !EquationParserErrorHandler methodsFor: 'error handling'!
  79.  
  80. error: anErrorType with: aString at: aLocation
  81.     "flag an error"
  82.     "^(MenuBuilder menuFromString: aString) startUp."
  83.     ^(PopUpTextMenu labels: (aString asText) lines: #(1)) startUp.! !
  84.  
  85. Object subclass: #EquationTree
  86.     instanceVariableNames: ''
  87.     classVariableNames: ''
  88.     poolDictionaries: ''
  89.     category: 'SDS-Equations'!
  90. EquationTree comment:
  91. 'I am an abstract class for a parse tree.
  92.     
  93.     Instance Method:
  94.     ValueAt:
  95.          finds a value of the tree at a certain time. It calls
  96.         valueAt: modeCalc which should be defined in the subclass.'!
  97.  
  98.  
  99. !EquationTree methodsFor: 'accessing'!
  100.  
  101. findCircularity: aSymbol 
  102.     "I can be redefined in subclass, it is used to find a circularity 
  103.     in the equation tree"
  104.  
  105.     ^false!
  106.  
  107. findSymbols: aSet 
  108.     "I can be redefined in my subclass. I t appends my name in the set"
  109.  
  110.     ^aSet!
  111.  
  112. valueAt: anIndex
  113.     "finding values at certain index time"
  114.     ^self valueAt: anIndex modeCalc: #default!
  115.  
  116. valueAt: anIndex modeCalc: aMode
  117.     self subclassResponsibility! !
  118.  
  119. EquationTree subclass: #SymbolTree
  120.     instanceVariableNames: 'symbol '
  121.     classVariableNames: ''
  122.     poolDictionaries: ''
  123.     category: 'SDS-Equations'!
  124. SymbolTree comment:
  125. 'a Tree for a symbol/ variable
  126.     Instance variables:
  127.         symbol <Entity>     a link to the variable''s Entity object'!
  128.  
  129.  
  130. !SymbolTree methodsFor: 'accessing'!
  131.  
  132. findCircularity: aSymbol 
  133.     
  134.     aSymbol = symbol name
  135.         ifTrue: [^true]
  136.         ifFalse:[^symbol findCircularity: aSymbol]!
  137.  
  138. findSymbols: aSet
  139.     aSet add: symbol.
  140.     ^aSet!
  141.  
  142. symbol
  143.     ^symbol!
  144.  
  145. symbol:aSymbol
  146.     ^symbol _ aSymbol!
  147.  
  148. valueAt: anIndex modeCalc: aMode 
  149.     " aMode = rungeKutta2 still doesn't work"
  150.  
  151.     anIndex = 1
  152.         ifTrue: [^symbol initValue]
  153.         ifFalse: 
  154.             [aMode = #default ifTrue: [^symbol valueAt: anIndex].
  155.             aMode = #rungeKutta2 ifTrue: [symbol class = Entity
  156.                     ifTrue: [^(symbol valueAt: anIndex)
  157.                             + (symbol valueAt: anIndex - 1) / 2]
  158.                     ifFalse: [^symbol valueAt: anIndex]].
  159.             ]! !
  160.  
  161. !SymbolTree methodsFor: 'printing'!
  162.  
  163. printTree
  164.     "returns the equation string of this tree"
  165.  
  166.     ^symbol name asString! !
  167. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  168.  
  169. SymbolTree class
  170.     instanceVariableNames: ''!
  171.  
  172.  
  173. !SymbolTree class methodsFor: 'instance creation'!
  174.  
  175. withSymbol: aSymbol
  176.     |aTree|
  177.     aTree _ SymbolTree new.
  178.     aTree symbol: aSymbol.
  179.     ^aTree! !
  180.  
  181. EquationTree subclass: #EquationOneTree
  182.     instanceVariableNames: 'subtree '
  183.     classVariableNames: ''
  184.     poolDictionaries: ''
  185.     category: 'SDS-Equations'!
  186. EquationOneTree comment:
  187. 'I am an abstract class of  a parse tree with one parameter.
  188.     instance variable:
  189.         subtree:
  190.             a parse tree for its parameter'!
  191.  
  192.  
  193. !EquationOneTree methodsFor: 'accessing'!
  194.  
  195. findCircularity: aSymbol
  196.     ^subtree findCircularity: aSymbol!
  197.  
  198. findSymbols: aSet
  199.     ^subtree findSymbols: aSet.!
  200.  
  201. value: aTree 
  202.     "connects aTree as a subtree"
  203.  
  204.     subtree _ aTree.
  205.     ^self! !
  206.  
  207. EquationOneTree subclass: #TanTree
  208.     instanceVariableNames: ''
  209.     classVariableNames: ''
  210.     poolDictionaries: ''
  211.     category: 'SDS-Equations'!
  212. TanTree comment:
  213. 'a parse tree for tan(expr)'!
  214.  
  215.  
  216. !TanTree methodsFor: 'creation'!
  217.  
  218. create
  219.     "create another TanTree, and returns the new object"
  220.  
  221.     |aTanTree|
  222.     aTanTree _ TanTree new.
  223.     ^aTanTree! !
  224.  
  225. !TanTree methodsFor: 'accessing'!
  226.  
  227. value: aTree
  228.     subtree _ aTree.
  229.     ^self.!
  230.  
  231. valueAt: anIndex modeCalc: aMode
  232.     |aNumber|
  233.     aNumber _ subtree valueAt: anIndex modeCalc: aMode.
  234.     aNumber ~= nil ifTrue: [^aNumber tan].
  235.     ^nil! !
  236.  
  237. !TanTree methodsFor: 'printing'!
  238.  
  239. printTree
  240.     "returns the equation string of this tree"
  241.  
  242.     ^'tan (' , subtree printTree , ')'! !
  243. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  244.  
  245. TanTree class
  246.     instanceVariableNames: ''!
  247.  
  248.  
  249. !TanTree class methodsFor: 'instance creation'!
  250.  
  251. withSubTree: aTree
  252.     
  253.     |aTanTree|
  254.     aTanTree _ TanTree new.
  255.     aTanTree value: aTree.
  256.     ^aTanTree! !
  257.  
  258. EquationOneTree subclass: #UnaryMinusTree
  259.     instanceVariableNames: ''
  260.     classVariableNames: ''
  261.     poolDictionaries: ''
  262.     category: 'SDS-Equations'!
  263. UnaryMinusTree comment:
  264. 'a parse tree for -expr'!
  265.  
  266.  
  267. !UnaryMinusTree methodsFor: 'creation'!
  268.  
  269. create
  270.     "create another TanTree, and returns the new object"
  271.  
  272.     |aUnaryMinusTree|
  273.     aUnaryMinusTree _ UnaryMinusTree new.
  274.     ^aUnaryMinusTree! !
  275.  
  276. !UnaryMinusTree methodsFor: 'accessing'!
  277.  
  278. value: aTree
  279.     subtree _ aTree.
  280.     ^self.!
  281.  
  282. valueAt: anIndex modeCalc: aMode
  283.     |aNumber|
  284.     aNumber _ subtree valueAt: anIndex modeCalc: aMode.
  285.     aNumber ~= nil ifTrue: [^aNumber negated].
  286.     ^nil! !
  287.  
  288. !UnaryMinusTree methodsFor: 'printing'!
  289.  
  290. printTree
  291.     "returns the equation string of this tree"
  292.  
  293.     ^'-',subtree printTree.! !
  294. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  295.  
  296. UnaryMinusTree class
  297.     instanceVariableNames: ''!
  298.  
  299.  
  300. !UnaryMinusTree class methodsFor: 'instance creation'!
  301.  
  302. withSubTree: aTree
  303.     
  304.     |aUnaryMinusTree|
  305.     aUnaryMinusTree _ UnaryMinusTree new.
  306.     aUnaryMinusTree value: aTree.
  307.     ^aUnaryMinusTree! !
  308.  
  309. EquationOneTree subclass: #LnTree
  310.     instanceVariableNames: ''
  311.     classVariableNames: ''
  312.     poolDictionaries: ''
  313.     category: 'SDS-Equations'!
  314. LnTree comment:
  315. 'a parse tree for ln(expr)'!
  316.  
  317.  
  318. !LnTree methodsFor: 'accessing'!
  319.  
  320. value: aTree
  321.     subtree _ aTree.
  322.     ^self.!
  323.  
  324. valueAt: anIndex modeCalc: aMode
  325.     |aNumber|
  326.     aNumber _ subtree valueAt: anIndex modeCalc: aMode.
  327.     aNumber ~= nil ifTrue: [^aNumber ln].
  328.     ^nil! !
  329.  
  330. !LnTree methodsFor: 'creation'!
  331.  
  332. create
  333.     "create another LnTree, and returns the new object"
  334.  
  335.     |aLnTree|
  336.     aLnTree _ LnTree new.
  337.     ^aLnTree! !
  338.  
  339. !LnTree methodsFor: 'printing'!
  340.  
  341. printTree
  342.     "returns the equation string of this tree"
  343.  
  344.     ^'ln (' , subtree printTree , ')'! !
  345. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  346.  
  347. LnTree class
  348.     instanceVariableNames: ''!
  349.  
  350.  
  351. !LnTree class methodsFor: 'instance creation'!
  352.  
  353. withSubTree: aTree
  354.     
  355.     |aLnTree|
  356.     aLnTree _ LnTree new.
  357.     aLnTree value: aTree.
  358.     ^aLnTree! !
  359.  
  360. EquationOneTree subclass: #SinTree
  361.     instanceVariableNames: ''
  362.     classVariableNames: ''
  363.     poolDictionaries: ''
  364.     category: 'SDS-Equations'!
  365. SinTree comment:
  366. 'a parse tree for sin(expr)'!
  367.  
  368.  
  369. !SinTree methodsFor: 'access'!
  370.  
  371. value: aTree
  372.     subtree _ aTree.
  373.     ^self.! !
  374.  
  375. !SinTree methodsFor: 'creation'!
  376.  
  377. create
  378.     "create another SinTree, and returns the new object"
  379.  
  380.     |aSinTree|
  381.     aSinTree _ SinTree new.
  382.     ^aSinTree! !
  383.  
  384. !SinTree methodsFor: 'accessing'!
  385.  
  386. valueAt: anIndex modeCalc: aMode
  387.     |aNumber|
  388.     aNumber _ subtree valueAt: anIndex modeCalc: aMode.
  389.     aNumber ~= nil ifTrue: [^aNumber sin].
  390.     ^nil! !
  391.  
  392. !SinTree methodsFor: 'printing'!
  393.  
  394. printTree
  395.     "returns the equation string of this tree"
  396.  
  397.     ^'sin (' , subtree printTree , ')'! !
  398. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  399.  
  400. SinTree class
  401.     instanceVariableNames: ''!
  402.  
  403.  
  404. !SinTree class methodsFor: 'instance creation'!
  405.  
  406. withSubTree: aTree
  407.     
  408.     |aSinTree|
  409.     aSinTree _ SinTree new.
  410.     aSinTree value: aTree.
  411.     ^aSinTree! !
  412.  
  413. EquationOneTree subclass: #AbsTree
  414.     instanceVariableNames: ''
  415.     classVariableNames: ''
  416.     poolDictionaries: ''
  417.     category: 'SDS-Equations'!
  418. AbsTree comment:
  419. 'a parse tree for abs (expr).
  420. It is a subclass of EquationOneTree'!
  421.  
  422.  
  423. !AbsTree methodsFor: 'accessing'!
  424.  
  425. value: aTree
  426.     subtree _ aTree.
  427.     ^self.!
  428.  
  429. valueAt: anIndex modeCalc: aMode
  430.     |aNumber|
  431.     aNumber _ subtree valueAt: anIndex modeCalc: aMode.
  432.     aNumber ~= nil ifTrue: [^aNumber abs].
  433.     ^nil! !
  434.  
  435. !AbsTree methodsFor: 'creation'!
  436.  
  437. create
  438.     "create another AbsTree, and returns the new object"
  439.  
  440.     |aAbsTree|
  441.     aAbsTree _ AbsTree new.
  442.     ^aAbsTree! !
  443.  
  444. !AbsTree methodsFor: 'printing'!
  445.  
  446. printTree
  447.     "returns the equation string of this tree"
  448.  
  449.     ^'abs (' , subtree printTree , ')'! !
  450. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  451.  
  452. AbsTree class
  453.     instanceVariableNames: ''!
  454.  
  455.  
  456. !AbsTree class methodsFor: 'instance creation'!
  457.  
  458. withSubTree: aTree
  459.     
  460.     |aAbsTree|
  461.     aAbsTree _ AbsTree new.
  462.     aAbsTree value: aTree.
  463.     ^aAbsTree! !
  464.  
  465. EquationOneTree subclass: #ArcSinTree
  466.     instanceVariableNames: ''
  467.     classVariableNames: ''
  468.     poolDictionaries: ''
  469.     category: 'SDS-Equations'!
  470. ArcSinTree comment:
  471. 'a parse tree for arcSin(expr)
  472. a subclass of EquationOneTree'!
  473.  
  474.  
  475. !ArcSinTree methodsFor: 'accessing'!
  476.  
  477. value: aTree
  478.     subtree _ aTree.
  479.     ^self.!
  480.  
  481. valueAt: anIndex modeCalc: aMode
  482.     |aNumber|
  483.     aNumber _ subtree valueAt: anIndex modeCalc: aMode.
  484.     aNumber ~= nil ifTrue: [^aNumber arcSin].
  485.     ^nil! !
  486.  
  487. !ArcSinTree methodsFor: 'creation'!
  488.  
  489. create
  490.     "create another ArcSinTree, and returns the new object"
  491.  
  492.     |aArcSinTree|
  493.     aArcSinTree _ ArcSinTree new.
  494.     ^aArcSinTree! !
  495.  
  496. !ArcSinTree methodsFor: 'printing'!
  497.  
  498. printTree
  499.     "returns the equation string of this tree"
  500.  
  501.     ^'arcSin (' , subtree printTree , ')'! !
  502. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  503.  
  504. ArcSinTree class
  505.     instanceVariableNames: ''!
  506.  
  507.  
  508. !ArcSinTree class methodsFor: 'instance creation'!
  509.  
  510. withSubTree: aTree
  511.     
  512.     |aArcSinTree|
  513.     aArcSinTree _ ArcSinTree new.
  514.     aArcSinTree value: aTree.
  515.     ^aArcSinTree! !
  516.  
  517. EquationOneTree subclass: #StepTree
  518.     instanceVariableNames: ''
  519.     classVariableNames: ''
  520.     poolDictionaries: ''
  521.     category: 'SDS-Equations'!
  522. StepTree comment:
  523. 'This is a tree for a step function.
  524.     step(b) = 0 for time < b
  525.              1 for time >= b'!
  526.  
  527.  
  528. !StepTree methodsFor: 'accessing'!
  529.  
  530. value: aTree
  531.     subtree _ aTree.
  532.     ^self.!
  533.  
  534. valueAt: anIndex modeCalc: aMode 
  535.     | aNumber |
  536.     aNumber _ subtree valueAt: anIndex modeCalc: aMode.
  537.     aNumber ~= nil ifTrue: [aNumber > (TimeTree initTime + TimeTree delta * (anIndex - 1))
  538.             ifTrue: [^0]
  539.             ifFalse: [^1]].
  540.     ^nil! !
  541.  
  542. !StepTree methodsFor: 'creation'!
  543.  
  544. create
  545.     "create another SqrtTree, and returns the new object"
  546.  
  547.     |aStepTree|
  548.     aStepTree _ StepTree new.
  549.     ^aStepTree! !
  550.  
  551. !StepTree methodsFor: 'printing'!
  552.  
  553. printTree
  554.     "returns the equation string of this tree"
  555.  
  556.     ^'step (' , subtree printTree , ')'! !
  557. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  558.  
  559. StepTree class
  560.     instanceVariableNames: ''!
  561.  
  562.  
  563. !StepTree class methodsFor: 'instance creation'!
  564.  
  565. withSubTree: aTree
  566.     
  567.     |aStepTree  |
  568.     aStepTree _ StepTree new.
  569.     aStepTree value: aTree.
  570.     ^aStepTree! !
  571.  
  572. EquationOneTree subclass: #ExpTree
  573.     instanceVariableNames: ''
  574.     classVariableNames: ''
  575.     poolDictionaries: ''
  576.     category: 'SDS-Equations'!
  577. ExpTree comment:
  578. 'a parse tree for exp(expr)'!
  579.  
  580.  
  581. !ExpTree methodsFor: 'creation'!
  582.  
  583. create
  584.     "create another ExpTree, and returns the new object"
  585.  
  586.     |aExpTree|
  587.     aExpTree _ ExpTree new.
  588.     ^aExpTree! !
  589.  
  590. !ExpTree methodsFor: 'accessing'!
  591.  
  592. value: aTree
  593.     subtree _ aTree.
  594.     ^self.!
  595.  
  596. valueAt: anIndex modeCalc: aMode
  597.     |aNumber|
  598.     aNumber _ subtree valueAt: anIndex modeCalc: aMode.
  599.     aNumber ~= nil ifTrue: [^aNumber exp].
  600.     ^nil! !
  601.  
  602. !ExpTree methodsFor: 'printing'!
  603.  
  604. printTree
  605.     "returns the equation string of this tree"
  606.  
  607.     ^'exp (' , subtree printTree , ')'! !
  608. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  609.  
  610. ExpTree class
  611.     instanceVariableNames: ''!
  612.  
  613.  
  614. !ExpTree class methodsFor: 'instance creation'!
  615.  
  616. withSubTree: aTree
  617.     
  618.     |aExpTree|
  619.     aExpTree _ ExpTree new.
  620.     aExpTree value: aTree.
  621.     ^aExpTree! !
  622.  
  623. EquationOneTree subclass: #ArcCosTree
  624.     instanceVariableNames: ''
  625.     classVariableNames: ''
  626.     poolDictionaries: ''
  627.     category: 'SDS-Equations'!
  628. ArcCosTree comment:
  629. 'A parse tree for arcCos(expr)
  630. a subclass of EquationOneTree'!
  631.  
  632.  
  633. !ArcCosTree methodsFor: 'accessing'!
  634.  
  635. value: aTree
  636.     subtree _ aTree.
  637.     ^self.!
  638.  
  639. valueAt: anIndex modeCalc: aMode
  640.     |aNumber|
  641.     aNumber _ subtree valueAt: anIndex modeCalc: aMode.
  642.     aNumber ~= nil ifTrue: [^aNumber arcCos].
  643.     ^nil! !
  644.  
  645. !ArcCosTree methodsFor: 'creation'!
  646.  
  647. create
  648.     "create another ArcCosTree, and returns the new object"
  649.  
  650.     |aArcCosTree|
  651.     aArcCosTree _ ArcCosTree new.
  652.     ^aArcCosTree! !
  653.  
  654. !ArcCosTree methodsFor: 'printing'!
  655.  
  656. printTree
  657.     "returns the equation string of this tree"
  658.  
  659.     ^'arcCos (' , subtree printTree , ')'! !
  660. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  661.  
  662. ArcCosTree class
  663.     instanceVariableNames: ''!
  664.  
  665.  
  666. !ArcCosTree class methodsFor: 'instance creation'!
  667.  
  668. withSubTree: aTree
  669.     
  670.     |aArcCosTree|
  671.     aArcCosTree _ ArcCosTree new.
  672.     aArcCosTree value: aTree.
  673.     ^aArcCosTree! !
  674.  
  675. EquationOneTree subclass: #SqrtTree
  676.     instanceVariableNames: ''
  677.     classVariableNames: ''
  678.     poolDictionaries: ''
  679.     category: 'SDS-Equations'!
  680. SqrtTree comment:
  681. 'a parse tree for sqrt(expr)'!
  682.  
  683.  
  684. !SqrtTree methodsFor: 'accessing'!
  685.  
  686. value: aTree
  687.     subtree _ aTree.
  688.     ^self.!
  689.  
  690. valueAt: anIndex modeCalc: aMode
  691.     |aNumber|
  692.     aNumber _ subtree valueAt: anIndex modeCalc: aMode.
  693.     aNumber ~= nil ifTrue: [^aNumber sqrt].
  694.     ^nil! !
  695.  
  696. !SqrtTree methodsFor: 'creation'!
  697.  
  698. create
  699.     "create another SqrtTree, and returns the new object"
  700.  
  701.     |aSqrtTree|
  702.     aSqrtTree _ SqrtTree new.
  703.     ^aSqrtTree! !
  704.  
  705. !SqrtTree methodsFor: 'printing'!
  706.  
  707. printTree
  708.     "returns the equation string of this tree"
  709.  
  710.     ^'sqrt (' , subtree printTree , ')'! !
  711. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  712.  
  713. SqrtTree class
  714.     instanceVariableNames: ''!
  715.  
  716.  
  717. !SqrtTree class methodsFor: 'instance creation'!
  718.  
  719. withSubTree: aTree
  720.     
  721.     |aSqrtTree  |
  722.     aSqrtTree _ SqrtTree new.
  723.     aSqrtTree value: aTree.
  724.     ^aSqrtTree! !
  725.  
  726. EquationOneTree subclass: #CosTree
  727.     instanceVariableNames: ''
  728.     classVariableNames: ''
  729.     poolDictionaries: ''
  730.     category: 'SDS-Equations'!
  731. CosTree comment:
  732. 'a parse tree for cos(expr)'!
  733.  
  734.  
  735. !CosTree methodsFor: 'creation'!
  736.  
  737. create
  738.     "create another CosTree, and returns the new object"
  739.  
  740.     |aCosTree|
  741.     aCosTree _ CosTree new.
  742.     ^aCosTree! !
  743.  
  744. !CosTree methodsFor: 'accessing'!
  745.  
  746. value: aTree
  747.     subtree _ aTree.
  748.     ^self.!
  749.  
  750. valueAt: anIndex modeCalc: aMode
  751.     |aNumber|
  752.     aNumber _ subtree valueAt: anIndex modeCalc: aMode.
  753.     aNumber ~= nil ifTrue: [^aNumber cos].
  754.     ^nil! !
  755.  
  756. !CosTree methodsFor: 'printing'!
  757.  
  758. printTree
  759.     "returns the equation string of this tree"
  760.  
  761.     ^'cos (' , subtree printTree , ')'! !
  762. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  763.  
  764. CosTree class
  765.     instanceVariableNames: ''!
  766.  
  767.  
  768. !CosTree class methodsFor: 'instance creation'!
  769.  
  770. withSubTree: aTree
  771.     
  772.     |aCosTree|
  773.     aCosTree _ CosTree new.
  774.     aCosTree value: aTree.
  775.     ^aCosTree! !
  776.  
  777. EquationOneTree subclass: #ArcTanTree
  778.     instanceVariableNames: ''
  779.     classVariableNames: ''
  780.     poolDictionaries: ''
  781.     category: 'SDS-Equations'!
  782. ArcTanTree comment:
  783. 'a parse tree for arcTan(expr)'!
  784.  
  785.  
  786. !ArcTanTree methodsFor: 'accessing'!
  787.  
  788. value: aTree
  789.     subtree _ aTree.
  790.     ^self.!
  791.  
  792. valueAt: anIndex modeCalc: aMode
  793.     |aNumber|
  794.     aNumber _ subtree valueAt: anIndex modeCalc: aMode.
  795.     aNumber ~= nil ifTrue: [^aNumber arcTan].
  796.     ^nil! !
  797.  
  798. !ArcTanTree methodsFor: 'creation'!
  799.  
  800. create
  801.     "create another ArcTanTree, and returns the new object"
  802.  
  803.     |aArcTanTree|
  804.     aArcTanTree _ ArcTanTree new.
  805.     ^aArcTanTree! !
  806.  
  807. !ArcTanTree methodsFor: 'printing'!
  808.  
  809. printTree
  810.     "returns the equation string of this tree"
  811.  
  812.     ^'arcTan (' , subtree printTree , ')'! !
  813. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  814.  
  815. ArcTanTree class
  816.     instanceVariableNames: ''!
  817.  
  818.  
  819. !ArcTanTree class methodsFor: 'instance creation'!
  820.  
  821. withSubTree: aTree
  822.     
  823.     |aArcTanTree|
  824.     aArcTanTree _ ArcTanTree new.
  825.     aArcTanTree value: aTree.
  826.     ^aArcTanTree! !
  827.  
  828. EquationOneTree subclass: #LogTree
  829.     instanceVariableNames: ''
  830.     classVariableNames: ''
  831.     poolDictionaries: ''
  832.     category: 'SDS-Equations'!
  833. LogTree comment:
  834. 'a parse tree for log(expr)'!
  835.  
  836.  
  837. !LogTree methodsFor: 'accessing'!
  838.  
  839. value: aTree
  840.     subtree _ aTree.
  841.     ^self.!
  842.  
  843. valueAt: anIndex modeCalc: aMode
  844.     |aNumber|
  845.     aNumber _ subtree valueAt: anIndex modeCalc: aMode.
  846.     aNumber ~= nil ifTrue: [^aNumber log].
  847.     ^nil! !
  848.  
  849. !LogTree methodsFor: 'creation'!
  850.  
  851. create
  852.     "create another LogTree, and returns the new object"
  853.  
  854.     |aLogTree|
  855.     aLogTree _ LogTree new.
  856.     ^aLogTree! !
  857.  
  858. !LogTree methodsFor: 'printing'!
  859.  
  860. printTree
  861.     "returns the equation string of this tree"
  862.  
  863.     ^'log (' , subtree printTree , ')'! !
  864. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  865.  
  866. LogTree class
  867.     instanceVariableNames: ''!
  868.  
  869.  
  870. !LogTree class methodsFor: 'instance creation'!
  871.  
  872. withSubTree: aTree
  873.     
  874.     |aLogTree|
  875.     aLogTree _ LogTree new.
  876.     aLogTree value: aTree.
  877.     ^aLogTree! !
  878.  
  879. EquationTree subclass: #DtTree
  880.     instanceVariableNames: ''
  881.     classVariableNames: 'Delta '
  882.     poolDictionaries: ''
  883.     category: 'SDS-Equations'!
  884. DtTree comment:
  885. 'a parse tree for dt
  886.     Class variables:
  887.         delta <aNumber>'!
  888.  
  889.  
  890. !DtTree methodsFor: 'creation'!
  891.  
  892. create
  893.     "create another DtTree, and returns the new object"
  894.  
  895.     |aDtTree|
  896.     aDtTree _ DtTree new.
  897.     ^aDtTree! !
  898.  
  899. !DtTree methodsFor: 'accessing'!
  900.  
  901. value: aTree
  902.     subtree _ aTree.
  903.     ^self.!
  904.  
  905. valueAt: anIndex modeCalc: aMode
  906.     
  907.     ^DtTree delta! !
  908.  
  909. !DtTree methodsFor: 'printing'!
  910.  
  911. printTree
  912.     "returns the equation string of this tree"
  913.  
  914.     ^'dt'! !
  915. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  916.  
  917. DtTree class
  918.     instanceVariableNames: ''!
  919.  
  920.  
  921. !DtTree class methodsFor: 'instance creation'!
  922.  
  923. withSubTree: aTree
  924.     
  925.     |aDtTree|
  926.     aDtTree _ DtTree new.
  927.     aDtTree value: aTree.
  928.     ^aDtTree! !
  929.  
  930. !DtTree class methodsFor: 'accessing'!
  931.  
  932. delta
  933.     ^Delta!
  934.  
  935. delta: aDelta
  936.     ^Delta _ aDelta! !
  937.  
  938. EquationTree subclass: #TimeTree
  939.     instanceVariableNames: ''
  940.     classVariableNames: 'Delta FinalTime InitTime '
  941.     poolDictionaries: ''
  942.     category: 'SDS-Equations'!
  943. TimeTree comment:
  944. 'a parse tree for time
  945.     Class variables:
  946.         Delta <aNumber>
  947.                 delta time for simulation
  948.         FinalTime < aNumber>
  949.                 final time for simulation
  950.         InitTime <aNumber>
  951.                 starting time for simulation'!
  952.  
  953.  
  954. !TimeTree methodsFor: 'creation'!
  955.  
  956. create
  957.     |aTimeTree|
  958.     aTimeTree _ TimeTree new.
  959.     ^aTimeTree.! !
  960.  
  961. !TimeTree methodsFor: 'accessing'!
  962.  
  963. value: aTree
  964.     subtree _ aTree.
  965.     ^self.!
  966.  
  967. valueAt: anIndex modeCalc: aMode
  968.     ^(TimeTree initTime + TimeTree delta * (anIndex-1))! !
  969.  
  970. !TimeTree methodsFor: 'printing'!
  971.  
  972. printTree
  973.     "returns the equation string of this tree"
  974.  
  975.     ^'time'! !
  976. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  977.  
  978. TimeTree class
  979.     instanceVariableNames: ''!
  980.  
  981.  
  982. !TimeTree class methodsFor: 'instance creation'!
  983.  
  984. withCurrentTime: aCurrentTime 
  985.     | aTimeTree |
  986.     aTimeTree _ TimeTree new.
  987.     aTimeTree value: aCurrentTime.
  988.     ^aTimeTree! !
  989.  
  990. !TimeTree class methodsFor: 'changes'!
  991.  
  992. delta
  993.  
  994.     ^Delta!
  995.  
  996. finalTime
  997.  
  998.     ^FinalTime!
  999.  
  1000. initTime
  1001.  
  1002.     ^InitTime!
  1003.  
  1004. initTime: anInitTime finalTime: aFinalTime delta: aDelta
  1005.  
  1006.     InitTime _ anInitTime.
  1007.     FinalTime _ aFinalTime.
  1008.     Delta _ aDelta.! !
  1009.  
  1010. EquationTree subclass: #NumberTree
  1011.     instanceVariableNames: 'number '
  1012.     classVariableNames: ''
  1013.     poolDictionaries: ''
  1014.     category: 'SDS-Equations'!
  1015. NumberTree comment:
  1016. 'a parse tree for number
  1017.     '!
  1018.  
  1019.  
  1020. !NumberTree methodsFor: 'access'!
  1021.  
  1022. value: aValue
  1023.     ^number _  aValue.!
  1024.  
  1025. valueAt: anIndex modeCalc: aMode
  1026.     ^number! !
  1027.  
  1028. !NumberTree methodsFor: 'printing'!
  1029.  
  1030. printTree
  1031.     "returns the equation string of this tree"
  1032.  
  1033.     |aStream|
  1034.     aStream _ TextStream on: (String new).
  1035.     aStream print: number.
  1036.     ^aStream contents asString! !
  1037. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  1038.  
  1039. NumberTree class
  1040.     instanceVariableNames: ''!
  1041.  
  1042.  
  1043. !NumberTree class methodsFor: 'instance creation'!
  1044.  
  1045. withValue: aNumber
  1046.     |aTree|
  1047.     aTree _ NumberTree new.
  1048.     aTree value: aNumber.
  1049.     ^aTree.! !
  1050.  
  1051. EquationTree subclass: #EquationTwoTree
  1052.     instanceVariableNames: 'leftsubtree rightsubtree '
  1053.     classVariableNames: ''
  1054.     poolDictionaries: ''
  1055.     category: 'SDS-Equations'!
  1056. EquationTwoTree comment:
  1057. 'Abstract class of a parse tree with two parameters
  1058.  
  1059. Instance Variables:
  1060.     leftsubtree <EquationTree>
  1061.     rightsubtree <EquationTree>'!
  1062.  
  1063.  
  1064. !EquationTwoTree methodsFor: 'accessing'!
  1065.  
  1066. findCircularity: aSymbol 
  1067.     (leftsubtree findCircularity: aSymbol)
  1068.         ifTrue: [^true]
  1069.         ifFalse: [^rightsubtree findCircularity: aSymbol]!
  1070.  
  1071. findSymbols: aSet
  1072.     |tempSet|
  1073.     tempSet _ leftsubtree findSymbols: aSet.
  1074.     ^rightsubtree findSymbols: tempSet!
  1075.  
  1076. leftSubTree: aLeftTree rightSubTree: aRightTree
  1077.  
  1078.     leftsubtree _ aLeftTree.
  1079.     rightsubtree _ aRightTree.
  1080.     ^self! !
  1081.  
  1082. EquationTwoTree subclass: #DivideTree
  1083.     instanceVariableNames: ''
  1084.     classVariableNames: ''
  1085.     poolDictionaries: ''
  1086.     category: 'SDS-Equations'!
  1087. DivideTree comment:
  1088. 'a parse tree for expr / expr'!
  1089.  
  1090.  
  1091. !DivideTree methodsFor: 'accessing'!
  1092.  
  1093. leftSubTree: aLeftTree rightSubTree: aRightTree
  1094.  
  1095.     leftsubtree _ aLeftTree.
  1096.     rightsubtree _ aRightTree.
  1097.     ^self!
  1098.  
  1099. valueAt: anIndex modeCalc: aMode 
  1100.     ^(leftsubtree valueAt: anIndex modeCalc: aMode)
  1101.         / (rightsubtree valueAt: anIndex modeCalc: aMode)! !
  1102.  
  1103. !DivideTree methodsFor: 'printing'!
  1104.  
  1105. printTree
  1106.     "prints the equation for this tree"
  1107.  
  1108.     | aString |
  1109.     leftsubtree class = PlusTree | (leftsubtree class = MinusTree)
  1110.         ifTrue: [aString _ '(' , leftsubtree printTree , ') / ']
  1111.         ifFalse: [aString _ leftsubtree printTree , ' / '].
  1112.     rightsubtree class = PlusTree | (rightsubtree class = MinusTree) | (rightsubtree class = MultiplyTree)
  1113.         ifTrue: [^aString , '(' , rightsubtree printTree , ')']
  1114.         ifFalse: [^aString , rightsubtree printTree]! !
  1115. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  1116.  
  1117. DivideTree class
  1118.     instanceVariableNames: ''!
  1119.  
  1120.  
  1121. !DivideTree class methodsFor: 'instance creation'!
  1122.  
  1123. leftSubTree: aLeftTree rightSubTree: aRightTree
  1124.  
  1125.     |aTree|
  1126.     aTree _DivideTree new.
  1127.     ^aTree leftSubTree: aLeftTree rightSubTree: aRightTree! !
  1128.  
  1129. EquationTwoTree subclass: #MultiplyTree
  1130.     instanceVariableNames: ''
  1131.     classVariableNames: ''
  1132.     poolDictionaries: ''
  1133.     category: 'SDS-Equations'!
  1134. MultiplyTree comment:
  1135. 'a parse tree for expr * expr'!
  1136.  
  1137.  
  1138. !MultiplyTree methodsFor: 'accessing'!
  1139.  
  1140. leftSubTree: aLeftTree rightSubTree: aRightTree
  1141.  
  1142.     leftsubtree _ aLeftTree.
  1143.     rightsubtree _ aRightTree.
  1144.     ^self!
  1145.  
  1146. valueAt: anIndex modeCalc: aMode
  1147.  
  1148.     ^(leftsubtree valueAt: anIndex modeCalc: aMode) * (rightsubtree valueAt: anIndex modeCalc: aMode)! !
  1149.  
  1150. !MultiplyTree methodsFor: 'printing'!
  1151.  
  1152. printTree
  1153.     | aString |
  1154.     leftsubtree class = PlusTree | (leftsubtree class = MinusTree)
  1155.         ifTrue: [aString _ '(' , leftsubtree printTree , ') * ']
  1156.         ifFalse: [aString _ leftsubtree printTree , ' * '].
  1157.     rightsubtree class = PlusTree | (rightsubtree class = MinusTree)
  1158.         ifTrue: [^aString , '(' , rightsubtree printTree , ')']
  1159.         ifFalse: [^aString , rightsubtree printTree]! !
  1160. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  1161.  
  1162. MultiplyTree class
  1163.     instanceVariableNames: ''!
  1164.  
  1165.  
  1166. !MultiplyTree class methodsFor: 'instance creation'!
  1167.  
  1168. leftSubTree: aLeftTree rightSubTree: aRightTree 
  1169.     | aTree |
  1170.     aTree _ MultiplyTree new.
  1171.     ^aTree leftSubTree: aLeftTree rightSubTree: aRightTree! !
  1172.  
  1173. EquationTwoTree subclass: #MinusTree
  1174.     instanceVariableNames: ''
  1175.     classVariableNames: ''
  1176.     poolDictionaries: ''
  1177.     category: 'SDS-Equations'!
  1178. MinusTree comment:
  1179. 'a parse tree for expr - expr'!
  1180.  
  1181.  
  1182. !MinusTree methodsFor: 'accessing'!
  1183.  
  1184. leftSubTree: aLeftTree rightSubTree: aRightTree
  1185.  
  1186.     leftsubtree _ aLeftTree.
  1187.     rightsubtree _ aRightTree.
  1188.     ^self!
  1189.  
  1190. valueAt: anIndex modeCalc: aMode
  1191.     ^(leftsubtree valueAt: anIndex modeCalc: aMode)
  1192.         - (rightsubtree valueAt: anIndex modeCalc: aMode)! !
  1193.  
  1194. !MinusTree methodsFor: 'printing'!
  1195.  
  1196. printTree
  1197.     "print the equation of me"
  1198.      |aString|
  1199.     
  1200.     aString _ leftsubtree printTree,' - '.
  1201.     rightsubtree class = PlusTree 
  1202.         ifTrue: [^aString,'(',rightsubtree printTree,')']
  1203.         ifFalse:[^aString,rightsubtree printTree]! !
  1204. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  1205.  
  1206. MinusTree class
  1207.     instanceVariableNames: ''!
  1208.  
  1209.  
  1210. !MinusTree class methodsFor: 'instance creation'!
  1211.  
  1212. leftSubTree: aLeftTree rightSubTree: aRightTree
  1213.  
  1214.     |aTree|
  1215.     aTree _MinusTree new.
  1216.     ^aTree leftSubTree: aLeftTree rightSubTree: aRightTree! !
  1217.  
  1218. EquationTwoTree subclass: #PowerTree
  1219.     instanceVariableNames: ''
  1220.     classVariableNames: ''
  1221.     poolDictionaries: ''
  1222.     category: 'SDS-Equations'!
  1223. PowerTree comment:
  1224. 'a parse tree for expr^expr'!
  1225.  
  1226.  
  1227. !PowerTree methodsFor: 'accessing'!
  1228.  
  1229. leftSubTree: aLeftTree rightSubTree: aRightTree
  1230.  
  1231.     leftsubtree _ aLeftTree.
  1232.     rightsubtree _ aRightTree.
  1233.     ^self!
  1234.  
  1235. valueAt: anIndex modeCalc: aMode
  1236.  
  1237.     ^(leftsubtree valueAt: anIndex modeCalc: aMode) ** (rightsubtree valueAt: anIndex modeCalc: aMode)! !
  1238.  
  1239. !PowerTree methodsFor: 'printing'!
  1240.  
  1241. printTree
  1242.     | aString |
  1243.     leftsubtree class = PlusTree | (leftsubtree class = MinusTree)| (leftsubtree class = MultiplyTree) | (leftsubtree class = DivideTree)
  1244.         ifTrue: [aString _ '(' , leftsubtree printTree , ')^']
  1245.         ifFalse: [aString _ leftsubtree printTree , '^'].
  1246.     rightsubtree class = PlusTree | (rightsubtree class = MinusTree) | (rightsubtree class = MultiplyTree) | (rightsubtree class = DivideTree)
  1247.         ifTrue: [^aString , '(' , rightsubtree printTree , ')']
  1248.         ifFalse: [^aString , rightsubtree printTree]! !
  1249. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  1250.  
  1251. PowerTree class
  1252.     instanceVariableNames: ''!
  1253.  
  1254.  
  1255. !PowerTree class methodsFor: 'instance creation'!
  1256.  
  1257. leftSubTree: aLeftTree rightSubTree: aRightTree
  1258.  
  1259.     |aTree|
  1260.     aTree _ PowerTree new.
  1261.     ^aTree leftSubTree: aLeftTree rightSubTree: aRightTree! !
  1262.  
  1263. EquationTwoTree subclass: #PlusTree
  1264.     instanceVariableNames: ''
  1265.     classVariableNames: ''
  1266.     poolDictionaries: ''
  1267.     category: 'SDS-Equations'!
  1268. PlusTree comment:
  1269. 'a parse tree for expr + expr'!
  1270.  
  1271.  
  1272. !PlusTree methodsFor: 'accessing'!
  1273.  
  1274. leftSubTree: aLeftTree rightSubTree: aRightTree
  1275.  
  1276.     leftsubtree _ aLeftTree.
  1277.     rightsubtree _ aRightTree.
  1278.     ^self!
  1279.  
  1280. valueAt: anIndex modeCalc: aMode
  1281.  
  1282.     ^(leftsubtree valueAt: anIndex modeCalc: aMode) +( rightsubtree valueAt: anIndex modeCalc: aMode)! !
  1283.  
  1284. !PlusTree methodsFor: 'printing'!
  1285.  
  1286. printTree
  1287.     
  1288.     ^leftsubtree printTree,' + ' ,rightsubtree printTree! !
  1289. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  1290.  
  1291. PlusTree class
  1292.     instanceVariableNames: ''!
  1293.  
  1294.  
  1295. !PlusTree class methodsFor: 'instance creation'!
  1296.  
  1297. leftSubTree: aLeftTree rightSubTree: aRightTree
  1298.  
  1299.     |aTree|
  1300.     aTree _ PlusTree new.
  1301.     ^aTree leftSubTree: aLeftTree rightSubTree: aRightTree! !
  1302.  
  1303. Object subclass: #EquationListMenu
  1304.     instanceVariableNames: ''
  1305.     classVariableNames: ''
  1306.     poolDictionaries: ''
  1307.     category: 'SDS-Equations'!
  1308. EquationListMenu comment:
  1309. 'a PopUpMenu for equations. It builds a list of equation strings and print
  1310. them as a menu.
  1311. It is called using the class method:
  1312.     self withBoxes: anOrderedCollectionofBoxes'!
  1313.  
  1314. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  1315.  
  1316. EquationListMenu class
  1317.     instanceVariableNames: ''!
  1318.  
  1319.  
  1320. !EquationListMenu class methodsFor: 'accessing'!
  1321.  
  1322. withBoxes: anOCBoxes 
  1323.     | aString  selectorCollection chosenSelector boxDictionary |
  1324.     
  1325.     boxDictionary _ Dictionary new.
  1326.     anOCBoxes do: 
  1327.         [:box | 
  1328.         box  entity class = Entity
  1329.             ifTrue: [aString _ box name asString , ' _ ']
  1330.             ifFalse: 
  1331.                 [aString _ box  entity generateText asString.
  1332.                 aString _ aString , ' ; '.
  1333.                 aString _ aString , 'INIT(' , box name , ') _ '].
  1334.         box  entity isCompiled
  1335.             ifTrue: [aString _ aString , box entity printTree]
  1336.             ifFalse: [aString _ aString , '<Not Evaluated>'].
  1337.         "aSymbol _ aString.:"
  1338.         boxDictionary at: aString asSymbol put: box].
  1339.     (selectorCollection _ boxDictionary keys asSortedCollection)
  1340.     size = 0
  1341.         ifTrue: [^self].
  1342.     chosenSelector _ (PopUpMenu labelList: (Array with: selectorCollection)) startUp.
  1343.     chosenSelector _ chosenSelector = 0
  1344.         ifTrue: [nil]
  1345.         ifFalse: [selectorCollection at: chosenSelector].
  1346.     chosenSelector isNil
  1347.         ifFalse: [(boxDictionary at: chosenSelector) entity openView]! !
  1348.  
  1349. !EquationListMenu class methodsFor: 'examples'!
  1350.  
  1351. example
  1352.     "EquationListMenu example"
  1353.  
  1354.     | entityA entityB anOCEntity |
  1355.     EquationEditor initialize.
  1356.     EquationParser initializeFunctionDict: EquationEditor functionDictionary.
  1357.     entityA _ Entity withName: 'One' asSymbol.
  1358.     entityB _ Entity withName: 'Two' asSymbol.
  1359.     entityA add: entityA.
  1360.     entityA add: entityB.
  1361.     entityB add: entityA.
  1362.     anOCEntity _ OrderedCollection new.
  1363.     anOCEntity add: entityA; add: entityB.
  1364.     EquationListMenu withBoxes: anOCEntity! !
  1365.  
  1366. Object subclass: #Entity
  1367.     instanceVariableNames: 'equationEditor currentText name currentTime orderedValues currentIndex initValue '
  1368.     classVariableNames: ''
  1369.     poolDictionaries: ''
  1370.     category: 'SDS-Equations'!
  1371. Entity comment:
  1372. 'I am a class to be used as instance variables for various boxes
  1373. (StockBox, FaucetBox, Combiner) in SDS. It contains most information
  1374. about the box.
  1375. Instance variables:
  1376.     equationEditor <EquationEditor>
  1377.         a model for the equation of  the box.
  1378.     currentText <Text>
  1379.         an equation Text for the box
  1380.     name <Symbol>
  1381.         a name for the box
  1382.     currentTime <Number>
  1383.         current time of simulation (is not used?)
  1384.     currentIndex <Number>
  1385.         current index time of simulation 
  1386.     initValue <Number>
  1387.         initial value of the box = orderedValues[1]
  1388.     orderedValues <OrderedCollection>
  1389.         list of simulation values for this box'!
  1390.  
  1391.  
  1392. !Entity methodsFor: 'accessing'!
  1393.  
  1394. box: aBox
  1395.     "Set my equation editor's box"
  1396.     
  1397.     equationEditor box: aBox.!
  1398.  
  1399. delta
  1400.     ^delta!
  1401.  
  1402. delta: aDelta
  1403.     ^delta _ aDelta!
  1404.  
  1405. equationEditor
  1406.     ^equationEditor!
  1407.  
  1408. equationEditor: anEquationEditor
  1409.     ^equationEditor _ anEquationEditor!
  1410.  
  1411. finalTime
  1412.     ^finalTime!
  1413.  
  1414. finalTime: aTime
  1415.     ^finalTime _ aTime!
  1416.  
  1417. findCircularity: aName 
  1418.     "findout whether the equationTree has 'circularity' or not"
  1419.     name = aName ifTrue: [^true].
  1420.     equationEditor = nil ifTrue: [^false].
  1421.     equationEditor equationTree = nil
  1422.         ifTrue: [^equationEditor isInSymbolDictionary: aName]
  1423.         ifFalse: [^equationEditor equationTree findCircularity: aName]!
  1424.  
  1425. initTime
  1426.     ^initTime!
  1427.  
  1428. initTime: aTime
  1429.     ^initTime _ aTime!
  1430.  
  1431. initValue
  1432.     initValue = nil ifTrue: [^initValue _  self valueAt: 1]
  1433.                    ifFalse: [^initValue]!
  1434.  
  1435. isCompiled
  1436.     "check whether I have been compiled or not"
  1437.  
  1438.     equationEditor == nil ifTrue: [^false].
  1439.     ^equationEditor isCompiled!
  1440.  
  1441. isCompiled: aBoolean
  1442.     equationEditor == nil ifTrue: [^nil].
  1443.     ^equationEditor isCompiled: aBoolean!
  1444.  
  1445. isError
  1446.     ^isError!
  1447.  
  1448. isError: aBoolean
  1449.     ^isError_ aBoolean!
  1450.  
  1451. name
  1452.     ^name!
  1453.  
  1454. name: aSymbol
  1455.     equationEditor == nil ifFalse: [equationEditor name: aSymbol].
  1456.     ^name _ aSymbol!
  1457.  
  1458. orderedValues
  1459.     ^orderedValues!
  1460.  
  1461. resetState
  1462.     "reset the state to the beginning of the simulation"
  1463.  
  1464.     initValue _ nil.
  1465.     currentIndex _ 1.!
  1466.  
  1467. valueAt: anIndex 
  1468.     ^self valueAt: anIndex modeCalc: #default!
  1469.  
  1470. valueAt: anIndex modeCalc: aMode
  1471.     "finds the value of the object at a given time"
  1472.  
  1473.     equationEditor == nil ifTrue: [^nil].
  1474.     equationEditor equationTree == nil ifTrue: [^nil].
  1475.     initValue = nil
  1476.         ifTrue: 
  1477.             [orderedValues _ OrderedCollection new.
  1478.             initValue _ equationEditor equationTree valueAt: anIndex.
  1479.             orderedValues add: initValue.
  1480.             currentIndex _ anIndex + 1.
  1481.             ^orderedValues at: anIndex].
  1482.     anIndex < currentIndex
  1483.         ifTrue: [^orderedValues at: anIndex]
  1484.         ifFalse: 
  1485.             [orderedValues add: (equationEditor equationTree valueAt: anIndex modeCalc: aMode).
  1486.             currentIndex _ anIndex + 1.
  1487.             ^orderedValues at: anIndex]! !
  1488.  
  1489. !Entity methodsFor: 'dependencies'!
  1490.  
  1491. add: anEntity 
  1492.     "addding anEntity as one of my dependents. My equation will have to depend on this"
  1493.  
  1494.     self isCompiled: false.
  1495.     ^equationEditor at: anEntity name put: anEntity!
  1496.  
  1497. delete: anEntity
  1498.     "deletes anEntity from my symbolTable list. My equation can not
  1499. depend on this anymore"
  1500.     self isCompiled: false.
  1501.     ^equationEditor delete: anEntity! !
  1502.  
  1503. !Entity methodsFor: 'editing'!
  1504.  
  1505. openView
  1506.     "opens the equationView"
  1507.     EquationView openOn: equationEditor! !
  1508.  
  1509. !Entity methodsFor: 'printing'!
  1510.  
  1511. printTree
  1512.  
  1513.     ^equationEditor printTree! !
  1514. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  1515.  
  1516. Entity class
  1517.     instanceVariableNames: ''!
  1518.  
  1519.  
  1520. !Entity class methodsFor: 'instance creation'!
  1521.  
  1522. withName: aName 
  1523.     | anEntity aSymbolDictionary anEquationEditor |
  1524.     anEntity _ Entity new.
  1525.     
  1526.     aSymbolDictionary _ Dictionary new.
  1527.     anEquationEditor _ EquationEditor withSymbols: aSymbolDictionary.
  1528.     anEquationEditor name: aName.
  1529.     anEntity equationEditor: anEquationEditor.
  1530.     anEntity name: aName; isCompiled: false.
  1531.     ^anEntity!
  1532.  
  1533. withName: aName andDelta: aDelta andInitialTime: anInitTime andFinalTime: aFinalTime
  1534.     |anEntity aSymbolDictionary anEquationEditor|
  1535.     anEntity _ Entity new.
  1536.     anEntity name: aName ; delta: aDelta ; initTime: anInitTime ; finalTime: aFinalTime.
  1537.     aSymbolDictionary _ Dictionary new.
  1538.     anEquationEditor _ EquationEditor withSymbols: aSymbolDictionary.
  1539.     anEquationEditor name: aName.
  1540.     anEntity equationEditor: anEquationEditor. 
  1541.     ^anEntity.! !
  1542.  
  1543. !Entity class methodsFor: 'examples'!
  1544.  
  1545. example
  1546.     "Entity example"
  1547.  
  1548.     | entityA entityB |
  1549.     EquationEditor initialize.
  1550.     EquationParser initializeFunctionDict: EquationEditor functionDictionary.
  1551.     entityA _ Entity
  1552.                 withName: 'One' asSymbol .
  1553.                 
  1554.     entityB _ Entity
  1555.                 withName: 'Two'  asSymbol.
  1556.                 
  1557.     entityA add: entityA.
  1558.     entityA add: entityB.
  1559.     entityB add: entityA.
  1560.     entityA openView! !
  1561.  
  1562. Entity subclass: #StockEntity
  1563.     instanceVariableNames: 'inputOC outputOC initEditor '
  1564.     classVariableNames: ''
  1565.     poolDictionaries: ''
  1566.     category: 'SDS-Equations'!
  1567. StockEntity comment:
  1568. 'I am a subclass of Entity. The difference between me and Entity is 
  1569. that I am used as an instance variable in StockBox. I have to equation,
  1570. one is the flow equation and the other is initialization equation. Flow
  1571. equation is defined in the system automatically, but initialization equation is defined by the user. 
  1572.     Instance Variables: 
  1573.         initEditor <initEditor>
  1574.             equation editor model for initialization equation.
  1575.         inputOC <OrderedCollection>
  1576.             a list of input of Entity in the box. It is used to generate
  1577. the flow equation.
  1578.         outputOC <OrderedCollection>
  1579.             a list of output of Entity in the box. It is used to generate
  1580. the flow equation.'!
  1581.  
  1582.  
  1583. !StockEntity methodsFor: 'dependencies'!
  1584.  
  1585. addInput: anEntity
  1586.     inputOC = nil ifTrue: [ inputOC _ OrderedCollection new].
  1587.     inputOC add: anEntity.
  1588.     ^equationEditor at: (anEntity name) put: anEntity.!
  1589.  
  1590. addOutput: anEntity
  1591.     outputOC = nil ifTrue: [ outputOC _ OrderedCollection new].
  1592.     outputOC add: anEntity.
  1593.     ^equationEditor at: (anEntity name) put: anEntity.!
  1594.  
  1595. createSymbolDict: anOCBoxes
  1596.  
  1597.     |mySymbolDict|
  1598.  
  1599.     mySymbolDict _ Dictionary new.
  1600.     anOCBoxes do: [:box | mySymbolDict at: box name put: box entity].
  1601.     ^initEditor symbolDictionary: mySymbolDict!
  1602.  
  1603. deleteInput: anEntity
  1604.     inputOC = nil ifTrue: [ ^nil].
  1605.     inputOC remove: anEntity ifAbsent: [^nil].
  1606.     ^self delete: anEntity.!
  1607.  
  1608. deleteOutput: anEntity
  1609.     outputOC = nil ifTrue: [ ^nil].
  1610.     outputOC remove: anEntity ifAbsent: [^nil].
  1611.     ^self delete: anEntity.! !
  1612.  
  1613. !StockEntity methodsFor: 'accessing'!
  1614.  
  1615. box: aBox
  1616.     "Set my init equation editor's box"
  1617.     
  1618.     initEditor box: aBox.!
  1619.  
  1620. findCircularity: aName 
  1621.     "findout whether the equationTree has 'circularity' or not"
  1622.  
  1623.     initEditor = nil ifTrue: [^false].
  1624.     initEditor equationTree = nil
  1625.         ifTrue: [^false]
  1626.         ifFalse: [^initEditor equationTree findCircularity: aName]!
  1627.  
  1628. generateText
  1629.  
  1630.     "generate text for the flow equation. It uses information
  1631. from inputOC and outputOC to generate the equation"
  1632.     | aString myText firstIsPrinted |
  1633.     firstIsPrinted _ false.
  1634.     aString _ name asString , ' _ ' , name asString.
  1635.     inputOC = nil ifFalse: [inputOC do: [:entity | firstIsPrinted
  1636.                 ifTrue: [aString _ aString , '+ ' , entity name asString]
  1637.                 ifFalse: 
  1638.                     [aString _ aString , ' + dt * (' , entity name asString.
  1639.                     firstIsPrinted _ true]]].
  1640.     outputOC = nil ifFalse: [outputOC do: [:entity | firstIsPrinted
  1641.                 ifTrue: [aString _ aString , '- ' , entity name asString]
  1642.                 ifFalse: 
  1643.                     [aString _ aString , ' + dt * ( -' , entity name asString.
  1644.                     firstIsPrinted _ true]]].
  1645.     firstIsPrinted ifTrue: [aString _ aString , ')'].
  1646.     myText _ aString asText.
  1647.     ^myText!
  1648.  
  1649. initEditor
  1650.     ^initEditor!
  1651.  
  1652. initEditor: anInitEditor
  1653.     ^initEditor_ anInitEditor!
  1654.  
  1655. isCompiled
  1656.     initEditor == nil ifTrue: [^false].
  1657.     ^initEditor isCompiled!
  1658.  
  1659. isCompiled: aBoolean
  1660.     initEditor == nil ifTrue: [^nil].
  1661.     ^initEditor isCompiled: aBoolean!
  1662.  
  1663. name: aSymbol
  1664.     equationEditor == nil ifFalse: [equationEditor name: aSymbol].
  1665.     initEditor == nil ifFalse: [initEditor name: aSymbol].
  1666.     ^name _ aSymbol!
  1667.  
  1668. printTree
  1669.     ^initEditor printTree!
  1670.  
  1671. valueAt: anIndex 
  1672.     ^self valueAt: anIndex modeCalc: #default!
  1673.  
  1674. valueAt: anIndex modeCalc: aMode
  1675.     | aNumber |
  1676.     equationEditor == nil ifTrue: [^nil].
  1677.     equationEditor equationTree == nil ifTrue: [^nil].
  1678.     initEditor == nil ifTrue: [^nil].
  1679.     initEditor equationTree == nil ifTrue: [^nil].
  1680.     initValue = nil
  1681.         ifTrue: 
  1682.             [orderedValues _ OrderedCollection new.
  1683.             orderedValues add: (initEditor equationTree valueAt: anIndex).
  1684.             currentIndex _ anIndex + 1.
  1685.             initValue _ orderedValues at: 1.
  1686.             ^orderedValues at: anIndex].
  1687.     anIndex < currentIndex
  1688.         ifTrue: [^orderedValues at: anIndex]
  1689.         ifFalse: 
  1690.             [aNumber _ equationEditor equationTree valueAt: anIndex-1 modeCalc: aMode.
  1691.             orderedValues addLast: aNumber.
  1692.             currentIndex _ anIndex + 1.
  1693.             ^orderedValues at: anIndex]! !
  1694.  
  1695. !StockEntity methodsFor: 'editing'!
  1696.  
  1697. openView
  1698.     EquationView openOn: initEditor! !
  1699.  
  1700. !StockEntity methodsFor: 'parsing'!
  1701.  
  1702. parseText
  1703.     equationEditor recreateSymbolDictionary.
  1704.     equationEditor currentText: self generateText.
  1705.     equationEditor evaluateAndCheckCircularity: false! !
  1706. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  1707.  
  1708. StockEntity class
  1709.     instanceVariableNames: ''!
  1710.  
  1711.  
  1712. !StockEntity class methodsFor: 'examples'!
  1713.  
  1714. example
  1715.     "StockEntity example"
  1716.     |myStock hisStock herStock |
  1717.     myStock _ StockEntity withName: ( 'myStock' asSymbol).
  1718.     hisStock _ StockEntity withName: ('hisStock' asSymbol).
  1719.     herStock _ StockEntity withName: ('herStock' asSymbol).
  1720.     myStock addInput: hisStock.
  1721.     myStock addOutput: herStock.
  1722.     "^myStock generateText"
  1723.     myStock openView! !
  1724.  
  1725. !StockEntity class methodsFor: 'instance creation'!
  1726.  
  1727. withName: aName 
  1728.     | aStockEntity aSymbolDictionary  anInitEditor anEquationEditor anotherSymbolDictionary|
  1729.     aStockEntity _ StockEntity new.
  1730.     
  1731.     aSymbolDictionary _ Dictionary new.
  1732.     anInitEditor _ InitEditor withSymbols: aSymbolDictionary.
  1733.     anInitEditor name: aName; isCompiled: false.
  1734.     aStockEntity initEditor: anInitEditor.
  1735.     anotherSymbolDictionary _ Dictionary new.
  1736.     anEquationEditor _ EquationEditor withSymbols:     anotherSymbolDictionary.
  1737.     aStockEntity name: aName.
  1738.     anEquationEditor name: aName; isCompiled: false.
  1739.     anEquationEditor at: aName put: aStockEntity.
  1740.     aStockEntity equationEditor: anEquationEditor.
  1741.     ^aStockEntity! !
  1742.  
  1743. StandardSystemController subclass: #EquationController
  1744.     instanceVariableNames: ''
  1745.     classVariableNames: ''
  1746.     poolDictionaries: ''
  1747.     category: 'SDS-Equations'!
  1748. EquationController comment:
  1749. 'This is a subclass for EquationController. The only part that is 
  1750. modified it the close message, so it will ask to evaluate the equation
  1751. before closing the view.'!
  1752.  
  1753.  
  1754. !EquationController methodsFor: 'menu messages'!
  1755.  
  1756. close
  1757.     "The receiver's view should be removed from the screen and from the
  1758.     collection of scheduled views."
  1759.  
  1760.     model textChange  "check for changes in progress"
  1761.         ifFalse: [^self].
  1762.     status _ #closed.
  1763.     view erase! !
  1764.  
  1765. Model subclass: #EquationEditor
  1766.     instanceVariableNames: 'equationTree symbolDictionary currentSymbol currentFunction currentText compiledText controller equationParser name isCompiled box '
  1767.     classVariableNames: 'FunctionDictionary '
  1768.     poolDictionaries: ''
  1769.     category: 'SDS-Equations'!
  1770. EquationEditor comment:
  1771. 'I am the model for EquationView. I am used as an instance variable in
  1772. Entity and StockEntity.
  1773.     Instance Variables:
  1774.         equationTree <EquationTree>
  1775.             the  parse tree for my equation
  1776.         symbolDictionary <Dictionary>
  1777.             list of entities on which my equation should depend.
  1778.         currentSymbol <Symbol>
  1779.             current symbol selected in SelectionInListView
  1780.         currentFunction <Symbol>
  1781.             current function selected in SelectionInListView
  1782.         currentText <Text>
  1783.             current text in CodeView
  1784.         compiledText <Text>
  1785.             the latest compiled Text 
  1786.         controller <Controller>
  1787.              a link to my controller.
  1788.         equationParser <EquationParser>
  1789.             a parser that is used to parse my equation
  1790.         name <Symbol>
  1791.             my name
  1792.         isCompiled <Boolean>
  1793.             a flag to check whether my equation is compiled or not.
  1794.         box <Box>
  1795.             is not used anymore, it was used to put a link to boxes
  1796.  
  1797.     Class Variables:
  1798.         FunctionDictionary <Dictionary>
  1799.             is a list of functions which can be used.'!
  1800.  
  1801.  
  1802. !EquationEditor methodsFor: 'printing'!
  1803.  
  1804. printOn: aStream
  1805.     "prints the equation"
  1806.  
  1807.     ^equationTree printOn: aStream!
  1808.  
  1809. printTree
  1810.     "prints the equation"
  1811.  
  1812.     ^equationTree printTree! !
  1813.  
  1814. !EquationEditor methodsFor: 'symbol'!
  1815.  
  1816. editEntity
  1817.     "opens anEquation editor for the current symbol"
  1818.     currentSymbol == nil ifTrue: [^false].
  1819.     (symbolDictionary at: currentSymbol) openView!
  1820.  
  1821. insertSymbolText
  1822.     "insert currentSymbol in the current text"
  1823.     | aText |
  1824.     currentSymbol == nil ifTrue: [^false].    "currentText _ Text fromString:(currentText asString,currentFunction)."
  1825.     aText _ Text fromString: ' ',currentSymbol,' '.
  1826.     self controller deselect.
  1827.     self controller replaceSelectionWith: aText.
  1828.     self controller selectAt: self controller stopBlock stringIndex.
  1829.     self changed: #currentText!
  1830.  
  1831. symbolMenu
  1832.     "answers the menu for function SelectionInListView"
  1833.  
  1834.     ^ActionMenu labels: 'insert\edit' withCRs
  1835.                 selectors: #(insertSymbolText editEntity)! !
  1836.  
  1837. !EquationEditor methodsFor: 'function'!
  1838.  
  1839. functionMenu
  1840.     "answers the menu for function SelectionInListView"
  1841.  
  1842.     ^ActionMenu labels: 'insert ' 
  1843.                 selectors: #(insertFunctionText )!
  1844.  
  1845. insertFunctionText
  1846.     "insert function in the text, put parentheses if necessary, and
  1847. move the cursor  between parenthesis"
  1848.     | aText |
  1849.     currentFunction == nil ifTrue: [^false].
  1850.     currentFunction = 'dt' asSymbol | (currentFunction = 'time' asSymbol)
  1851.         ifTrue: 
  1852.             ["currentText _ Text fromString:(currentText 
  1853.             asString,currentFunction)."
  1854.             aText _ Text fromString: currentFunction.
  1855.             self controller deselect.
  1856.             self controller replaceSelectionWith: aText.
  1857.             self controller selectAt: self controller stopBlock stringIndex]
  1858.         ifFalse: 
  1859.             [aText _ Text fromString: currentFunction , '(' , ')'.
  1860.             self controller deselect.
  1861.             self controller replaceSelectionWith: aText.
  1862.             self controller selectAt: self controller stopBlock stringIndex - 1].
  1863.     self changed: #currentText! !
  1864.  
  1865. !EquationEditor methodsFor: 'text'!
  1866.  
  1867. acceptIt
  1868.     "NOT USED : it was used for debugging"
  1869.     currentText _ controller text.    
  1870.     InspectorView open: (Inspector inspect: currentText).    
  1871.     "InspectorView open: (Inspector inspect: symbolDictionary)."     "InspectorView open: (Inspector inspect: self printTree)."!
  1872.  
  1873. evaluateAndCheckCircularity: aBoolean
  1874.  
  1875.     "Evaluate the equation and check whether there exists some circularity"
  1876.  
  1877.     controller = nil ifFalse: [currentText _ controller text].
  1878.     equationParser == nil
  1879.         ifTrue: [equationParser _ EquationParser on: currentText]
  1880.         ifFalse: [equationParser scanText: currentText].
  1881.     equationParser symbolDictionary: symbolDictionary.
  1882.     equationParser name: name.
  1883.     equationTree _ equationParser parseAndCheckCircularity: aBoolean.
  1884.     equationTree = nil
  1885.         ifTrue: [self isCompiled: false]
  1886.         ifFalse: 
  1887.             [self isCompiled: true.    "box update"
  1888.             currentText _ (name asString , ' _ ' , self equationTree printTree) asText].
  1889.     self changed: #currentText.
  1890.     compiledText _ currentText copy.
  1891.     "InspectorView open: (Inspector inspect: equationTree)"!
  1892.  
  1893. evaluateIt
  1894.     self evaluateAndCheckCircularity: true!
  1895.  
  1896. textMenu
  1897.     "answers the menu used in the code view"
  1898.  
  1899.     ^ActionMenu
  1900.         labels: 'again\undo\copy\cut\paste\evaluate\cancel' withCRs
  1901.         lines: #(2 5 6 )
  1902.         selectors: #(#again #undo #copySelection #cut #paste #evaluateIt #cancel )!
  1903.  
  1904. updateRequest
  1905.     "evaluate the text if necessary"
  1906.  
  1907.     currentText ~= nil ifTrue: [self evaluateIt]! !
  1908.  
  1909. !EquationEditor methodsFor: 'removing'!
  1910.  
  1911. delete: anObject 
  1912.     "deleting an object from symbolDictionary. 
  1913.     Since we can not remove an object from a Dictionary 
  1914.     so we basically have to create a new symbolDictionary."
  1915.  
  1916.     | aNewDict |
  1917.     aNewDict _ Dictionary new.
  1918.     symbolDictionary do: [:entity | entity == anObject ifFalse: [aNewDict at: entity name put: entity]].
  1919.     symbolDictionary _ aNewDict.
  1920.     self changed: #listOfSymbols.! !
  1921.  
  1922. !EquationEditor methodsFor: 'accessing'!
  1923.  
  1924. at: aSymbol
  1925.     "returns the object represented as aSymbol"
  1926.  
  1927.     ^symbolDictionary at: aSymbol!
  1928.  
  1929. at: aSymbol ifAbsent: aBlock
  1930.     "returns the object represented as aSymbol"
  1931.  
  1932.     ^symbolDictionary at: aSymbol ifAbsent: aBlock!
  1933.  
  1934. at: aSymbol put: anObject
  1935.     "returns the object represented as aSymbol"
  1936.  
  1937.     ^symbolDictionary at: aSymbol put: anObject!
  1938.  
  1939. box
  1940.     "Answer the box which I belong to"
  1941.     
  1942.     ^box.!
  1943.  
  1944. box: aBox
  1945.     "assign the box which I belong to"
  1946.     
  1947.     box _ aBox.!
  1948.  
  1949. controller
  1950.     ^controller!
  1951.  
  1952. controller: aController
  1953.     ^controller_ aController!
  1954.  
  1955. currentFunction
  1956.     "returns the current Function"
  1957.  
  1958.     ^currentFunction!
  1959.  
  1960. currentFunction: aFunction
  1961.     "returns the current Function"
  1962.  
  1963.     ^currentFunction _ aFunction!
  1964.  
  1965. currentSymbol
  1966.     "returns the current symbol"
  1967.  
  1968.     ^currentSymbol!
  1969.  
  1970. currentSymbol: aSymbol 
  1971.     "returns the current symbol"
  1972.  
  1973.     ^currentSymbol _ aSymbol!
  1974.  
  1975. currentText
  1976.     "returns the current Text"
  1977.  
  1978.     currentText = '' asText ifTrue: [currentText _ (name asString , ' _ ') asText].
  1979.     self isCompiled ifTrue: [compiledText = currentText ifTrue: [currentText _ (name asString , ' _ ' , self equationTree printTree) asText]].
  1980.     ^currentText!
  1981.  
  1982. currentText: aText
  1983.     "returns the current text"
  1984.  
  1985.     ^(currentText _ aText)!
  1986.  
  1987. equationTree
  1988.     "returns the EquationTree"
  1989.  
  1990.     ^equationTree!
  1991.  
  1992. equationTree: aTree
  1993.     "returns the EquationTree"
  1994.  
  1995.     ^(equationTree_ aTree)!
  1996.  
  1997. functionDictionary
  1998.     ^FunctionDictionary!
  1999.  
  2000. isCompiled
  2001.     ^isCompiled!
  2002.  
  2003. isCompiled: aBoolean
  2004.     ^isCompiled _ aBoolean!
  2005.  
  2006. isInSymbolDictionary: aName 
  2007.     "check whether aName is in symbolDictionary or not"
  2008.  
  2009.     symbolDictionary = nil ifTrue: [^false].
  2010.     symbolDictionary do: [:entity | (entity findCircularity: aName)
  2011.             ifTrue: [^true]].
  2012.     ^false!
  2013.  
  2014. listOfFunction
  2015.     "returns list of symbols in the dictionary"
  2016.     FunctionDictionary == nil ifTrue: [^nil].
  2017.     ^FunctionDictionary keys asSortedCollection!
  2018.  
  2019. listOfSymbols
  2020.     "returns list of symbols in the dictionary"
  2021.     symbolDictionary == nil ifTrue: [^nil].
  2022.     ^symbolDictionary keys asSortedCollection!
  2023.  
  2024. name
  2025.     ^name!
  2026.  
  2027. name: aName
  2028.     ^name _ aName!
  2029.  
  2030. recreateSymbolDictionary
  2031.     | newSymbolDictionary |
  2032.     symbolDictionary = nil ifTrue:[^nil].
  2033.     newSymbolDictionary _ Dictionary new.
  2034.     symbolDictionary  do: [:entity | newSymbolDictionary at: entity name put: entity].
  2035.     symbolDictionary _ newSymbolDictionary.
  2036.     ^symbolDictionary!
  2037.  
  2038. symbolDictionary
  2039.     "returns the  symbolDictionary"
  2040.  
  2041.     ^symbolDictionary!
  2042.  
  2043. symbolDictionary: aDictionary
  2044.     "returns the new symbolDictionary"
  2045.  
  2046.     ^(symbolDictionary _ aDictionary)!
  2047.  
  2048. textChange
  2049.     "checks whether we need to reevaluate the text or not, if we do then we evaluate the text"
  2050.  
  2051.     self isCompiled ifFalse: [(self confirm: 'Text is not evaluated yet, evaluate ?')
  2052.             ifTrue: 
  2053.                 [self evaluateIt.
  2054.                 ^true]
  2055.             ifFalse: [^true]].
  2056.     currentText = compiledText
  2057.         ifTrue: 
  2058.             [self evaluateIt.
  2059.             ^true]
  2060.         ifFalse: [(self confirm: 'Text has been modified, evaluate?')
  2061.                 ifTrue: 
  2062.                     [self evaluateIt.
  2063.                     ^true]
  2064.                 ifFalse: [^true]]! !
  2065. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  2066.  
  2067. EquationEditor class
  2068.     instanceVariableNames: ''!
  2069.  
  2070.  
  2071. !EquationEditor class methodsFor: 'class initialization'!
  2072.  
  2073. initialize
  2074.     "EquationEditor initialize. It initializes the function dictionary"
  2075.     
  2076.     |funcDictionary|
  2077.     funcDictionary _ Dictionary new.
  2078.     funcDictionary at: #sin put:( SinTree withSubTree: nil)  ;
  2079.                 at: #cos put: (CosTree withSubTree: nil);
  2080.                 at: #abs put: (AbsTree withSubTree: nil) ;
  2081.                 at: #tan put: (TanTree withSubTree: nil) ;
  2082.                 at: #dt put: (DtTree withSubTree: nil)  ;
  2083.                 at: #log put: (LogTree withSubTree: nil)  ;
  2084.                 at: #sqrt put: (SqrtTree withSubTree: nil) ;
  2085.                 at: #ln put: (LnTree withSubTree: nil) ;
  2086.                 at: #exp put: (ExpTree withSubTree: nil) ;
  2087.                 at: #arcCos put: (ArcCosTree withSubTree: nil) ;
  2088.                 at: #arcSin put: (ArcSinTree withSubTree: nil) ;
  2089.                 at: #arcTan put: (ArcTanTree withSubTree: nil) ;
  2090.                 at: #time  put: (TimeTree withCurrentTime: 0) ;
  2091.                 at: #step put: (StepTree withSubTree: nil).
  2092.     FunctionDictionary _ funcDictionary! !
  2093.  
  2094. !EquationEditor class methodsFor: 'instance creation'!
  2095.  
  2096. withSymbols: aSymbolDictionary
  2097.     "creates an equation with a symbol dictionary"
  2098.  
  2099.     |anEquationEditor aText|
  2100.     aText _ Text new.
  2101.     anEquationEditor _ self new.
  2102.     anEquationEditor symbolDictionary: aSymbolDictionary.
  2103.     anEquationEditor equationTree: nil.
  2104.     anEquationEditor currentSymbol: nil.
  2105.     anEquationEditor currentFunction: nil.
  2106.     anEquationEditor currentText:  aText.
  2107.     ^anEquationEditor! !
  2108.  
  2109. !EquationEditor class methodsFor: 'accesing'!
  2110.  
  2111. functionDictionary
  2112.     ^FunctionDictionary! !
  2113.  
  2114. EquationEditor initialize!
  2115.  
  2116.  
  2117. EquationEditor subclass: #InitEditor
  2118.     instanceVariableNames: ''
  2119.     classVariableNames: ''
  2120.     poolDictionaries: ''
  2121.     category: 'SDS-Equations'!
  2122. InitEditor comment:
  2123. 'I am a subclass of EquationEditor. The difference between me and EquationEditor is that I am used as a model for INIT(symbol) equation
  2124. in StockBox.'!
  2125.  
  2126.  
  2127. !InitEditor methodsFor: 'text'!
  2128.  
  2129. evaluateIt
  2130.     "WARNING : equationParse is an instance of InitParser"
  2131.  
  2132.     controller = nil ifFalse: [currentText _ controller text].
  2133.     equationParser == nil
  2134.         ifTrue: [equationParser _ InitParser on: currentText]
  2135.         ifFalse: [equationParser scanText: currentText].
  2136.     equationParser symbolDictionary: symbolDictionary.
  2137.     equationParser name: name.
  2138.     equationTree _ equationParser parse.
  2139.     equationTree = nil
  2140.         ifTrue: [self isCompiled: false]
  2141.         ifFalse: 
  2142.             [self isCompiled: true.    "box update"
  2143.             currentText _ ('INIT(' , name asString , ') _ ' , self equationTree printTree) asText].
  2144.     self changed: #currentText.
  2145.     compiledText _ currentText copy.
  2146.     "InspectorView open: (Inspector inspect: equationTree)"! !
  2147.  
  2148. !InitEditor methodsFor: 'accessing'!
  2149.  
  2150. currentText
  2151.     "returns the current Text"
  2152.  
  2153.     currentText = '' asText ifTrue: [currentText _ ('INIT(',name asString , ') _ ') asText].
  2154.     self isCompiled ifTrue: [compiledText = currentText ifTrue: [currentText _ ('INIT(',name asString,') _ ',self equationTree printTree) asText]].
  2155.     ^currentText! !
  2156. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  2157.  
  2158. InitEditor class
  2159.     instanceVariableNames: ''!
  2160.  
  2161.  
  2162. !InitEditor class methodsFor: 'instance creation'!
  2163.  
  2164. withSymbols: aSymbolDictionary
  2165.     "creates an equation with a symbol dictionary"
  2166.  
  2167.     |anEquationEditor aText|
  2168.     aText _ Text new.
  2169.     anEquationEditor _ self new.
  2170.     anEquationEditor symbolDictionary: aSymbolDictionary.
  2171.     anEquationEditor equationTree: nil.
  2172.     anEquationEditor currentSymbol: nil.
  2173.     anEquationEditor currentFunction: nil.
  2174.     anEquationEditor currentText:  aText.
  2175.     ^anEquationEditor! !
  2176.  
  2177. View subclass: #EquationView
  2178.     instanceVariableNames: ''
  2179.     classVariableNames: ''
  2180.     poolDictionaries: ''
  2181.     category: 'SDS-Equations'!
  2182. EquationView comment:
  2183. 'This is the view for EquationEditor
  2184. It used by calling a class method: 
  2185.     self openOn:'!
  2186.  
  2187. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  2188.  
  2189. EquationView class
  2190.     instanceVariableNames: ''!
  2191.  
  2192.  
  2193. !EquationView class methodsFor: 'instance creation'!
  2194.  
  2195. openOn: anEquation 
  2196.     "EquationView openOn: anEquation"
  2197.  
  2198.     | topView aSelectionInListView1 aSelectionInListView2 aTextView aController |
  2199.     topView _ StandardSystemView
  2200.                 model: anEquation
  2201.                 label: 'Equation Editor for : ' , anEquation name
  2202.                 minimumSize: 250 @ 250.
  2203.     topView controller: EquationController new.
  2204.     topView borderWidth: 1.
  2205.     aSelectionInListView1 _ SelectionInListView
  2206.                 on: anEquation
  2207.                 printItems: true
  2208.                 oneItem: false
  2209.                 aspect: #currentSymbol
  2210.                 change: #currentSymbol:
  2211.                 list: #listOfSymbols
  2212.                 menu: #symbolMenu
  2213.                 initialSelection: #currentSymbol.
  2214.     topView
  2215.         addSubView: aSelectionInListView1
  2216.         in: (0 @ 0 extent: 0.5 @ 0.5)
  2217.         borderWidth: 1.
  2218.     aSelectionInListView2 _ SelectionInListView
  2219.                 on: anEquation
  2220.                 printItems: true
  2221.                 oneItem: false
  2222.                 aspect: #currentFunction
  2223.                 change: #currentFunction:
  2224.                 list: #listOfFunction
  2225.                 menu: #functionMenu
  2226.                 initialSelection: #currentFunction.
  2227.     topView
  2228.         addSubView: aSelectionInListView2
  2229.         in: (0.5 @ 0 extent: 1 @ 0.5)
  2230.         borderWidth: 1.
  2231.     aTextView _ CodeView
  2232.                 on: anEquation
  2233.                 aspect: #currentText
  2234.                 change: #currentText:
  2235.                 menu: #textMenu.    "aTextView controller: AlwaysAcceptCodeController new."
  2236.     aController _ MyTextController new.
  2237.     aTextView controller: aController.
  2238.     anEquation controller: aController.
  2239.     topView
  2240.         addSubView: aTextView
  2241.         in: (0 @ 0.5 extent: 1 @ 1)
  2242.         borderWidth: 1.
  2243.     topView controller model: anEquation.
  2244.     topView controller open! !
  2245.  
  2246. !EquationView class methodsFor: 'examples'!
  2247.  
  2248. example
  2249.     "EquationView example"
  2250.  
  2251.     | anEquation aSymbolDict |
  2252.     aSymbolDict _ Dictionary new.
  2253.     EquationEditor initialize.
  2254.     anEquation _ EquationEditor withSymbols: aSymbolDict.
  2255.     EquationParser initializeFunctionDict: anEquation functionDictionary.
  2256.     anEquation at: #blockA put: #blockAobject.
  2257.     anEquation at: #blockB put: #blockBobject.
  2258.     EquationView openOn: anEquation! !
  2259.  
  2260. Parser subclass: #EquationParser
  2261.     instanceVariableNames: 'symbolDictionary nextToken name '
  2262.     classVariableNames: 'FunctionDictionary '
  2263.     poolDictionaries: ''
  2264.     category: 'SDS-Equations'!
  2265. EquationParser comment:
  2266. 'I am the parser for equations. It uses Scanner to scan the text, parses
  2267. it and build an EquationTree.
  2268.     Instance Variables:
  2269.         symbolDictionary <Dictionary>
  2270.             a list of symbols on which the equation is dependent.
  2271.         nextToken <token>
  2272.             what is in the next token. Used by method peekToken.
  2273.         name <Symbol>
  2274.             my equation name
  2275.  
  2276.     Class variables:
  2277.         FunctionDictionary <Dictionary>
  2278.             a list of accepted functions'!
  2279.  
  2280.  
  2281. !EquationParser methodsFor: 'parsing text'!
  2282.  
  2283. expr
  2284.     "scan expression"
  2285.      "expr _ term restExpr "
  2286.     |aTree|
  2287.     aTree _ self term.
  2288.     aTree == nil ifTrue: [^self abort].
  2289.     ^self restExpr: aTree!
  2290.  
  2291. factor
  2292.     "factor _ number | function | (expr) | var | - factor"
  2293.  
  2294.     | aTree |
  2295.     self scanToken.
  2296.     token = $- asSymbol ifTrue: [^UnaryMinusTree withSubTree: self factor]. 
  2297.     tokenType == #number ifTrue: [^NumberTree withValue: token].
  2298.     tokenType == #word
  2299.         ifTrue: 
  2300.             ["must be either a function name 
  2301.             or var name"
  2302.             self tokenIsFunction ifTrue: [^self function].
  2303.             self tokenIsSymbol ifTrue: [^self symbol].
  2304.             ^self notify: 'unknown symbol: ' ].
  2305.      tokenType == #leftParenthesis
  2306.         ifTrue: 
  2307.             ["must call an expression"
  2308.             aTree _ self expr.
  2309.             aTree == nil ifTrue: [^self abort].
  2310.             self scanToken.
  2311.             tokenType == #rightParenthesis ifFalse: [^self notify: 'right parenthesis expected'.].
  2312.             ^aTree]
  2313.         ifFalse: [^self notify: 'illegal factor']!
  2314.  
  2315. function
  2316.     "function _ <function symbol> | <function-symbol> (expr)"
  2317.     | aTree myTree |
  2318.     myTree _ (FunctionDictionary at: token asSymbol) create.
  2319.     token = 'dt' ifTrue: [^myTree].
  2320.     token = 'time' ifTrue: [^myTree].
  2321.     self scanToken.
  2322.     tokenType == #leftParenthesis
  2323.         ifTrue: 
  2324.             [aTree _ self expr.
  2325.             aTree == nil ifTrue: [^self abort].
  2326.             myTree value: aTree.
  2327.             self scanToken.
  2328.             tokenType == #rightParenthesis
  2329.                 ifTrue: [^myTree]
  2330.                 ifFalse: [^self notify: 'syntax error: right parenthesis for function is needed']].
  2331.     ^self notify: 'syntax error: left parenthesis after function is needed'!
  2332.  
  2333. parse
  2334.     "build an equation tree"
  2335.  
  2336.     ^self parseAndCheckCircularity: false!
  2337.  
  2338. parseAndCheckCircularity: aBoolean
  2339.     "build an equation tree"
  2340.  
  2341.     | aTree |
  2342.     self scanToken.
  2343.     tokenType == #word ifTrue: [name = token asSymbol
  2344.             ifTrue: 
  2345.                 [self scanToken.
  2346.                 tokenType == #leftArrow
  2347.                     ifTrue: 
  2348.                         [aTree _ self expr.
  2349.                         aTree = nil ifTrue: [^nil].
  2350.                         (self checkAllSymbolsUsed: aTree)
  2351.                             ifFalse: [^self notify: 'Error: not all input are used'].
  2352.                         aBoolean ifTrue: [ (self checkCircularity: aTree)
  2353.                             ifTrue: [^self notify: 'Error: there is a circularity']].
  2354.                         self peekToken.
  2355.                         nextToken = nil ifTrue: [^aTree]
  2356.                                         ifFalse: [^self notify: 'syntax error: runaway characters']]
  2357.                     ifFalse: [^self notify: 'syntax error: _ is expected']]].
  2358.     ^self notify: 'syntax error: ' , name asString , ' is expected'!
  2359.  
  2360. powfactor
  2361.     
  2362.      "powfactor _ factor restPower  "
  2363.     |aTree|
  2364.     aTree _ self factor.
  2365.     aTree == nil ifTrue: [^self abort].
  2366.     ^self restPower: aTree!
  2367.  
  2368. restExpr: aTree 
  2369.     "restExpr _ + term restExpr | - term restExpr | empty"
  2370.  
  2371.     | tempTree |
  2372.     self peekToken.
  2373.     nextToken ~= $+ asSymbol & (nextToken ~= $- asSymbol) ifTrue: [^aTree].
  2374.     self scanToken.
  2375.     token == $+ asSymbol ifTrue: [tempTree _ PlusTree leftSubTree: aTree rightSubTree: self term].
  2376.     token == $- asSymbol ifTrue: [tempTree _ MinusTree leftSubTree: aTree rightSubTree: self term].
  2377.     tempTree = nil
  2378.         ifTrue: [^tempTree]
  2379.         ifFalse: [^self restExpr: tempTree]!
  2380.  
  2381. restFactor: aTree 
  2382.     "restFactor _ * powFactor restFactor | / powFactor restFactor | 
  2383.     empty"
  2384.  
  2385.     | tempTree temp1Tree |
  2386.     self peekToken.
  2387.     nextToken ~= $* asSymbol & (nextToken ~= $/ asSymbol) ifTrue: [^aTree].
  2388.     self scanToken.
  2389.     token == $* asSymbol ifTrue: [(temp1Tree _ self powfactor) ~= nil ifTrue: [tempTree _ MultiplyTree leftSubTree: aTree rightSubTree: temp1Tree]].
  2390.     token == $/ asSymbol ifTrue: [(temp1Tree _ self powfactor) ~= nil ifTrue: [tempTree _ DivideTree leftSubTree: aTree rightSubTree: temp1Tree]].
  2391.     tempTree = nil
  2392.         ifTrue: [^tempTree]
  2393.         ifFalse: [^self restFactor: tempTree]!
  2394.  
  2395. restPower: aTree 
  2396.     "restPower _ ^ factor restPower| empty"
  2397.  
  2398.     | tempTree |
  2399.     self peekToken.
  2400.     nextToken ~= $^ ifTrue: [^aTree].
  2401.     self scanToken.
  2402.     token == $^ ifTrue: [tempTree _ PowerTree leftSubTree: aTree rightSubTree: self factor].
  2403.     ^self restPower: tempTree!
  2404.  
  2405. symbol
  2406.     ^SymbolTree withSymbol: (symbolDictionary at: token asSymbol)!
  2407.  
  2408. term
  2409.     
  2410.      "term _ powfactor restFactor"
  2411.     |aTree|
  2412.     aTree _ self powfactor.
  2413.     aTree == nil ifTrue: [^self abort].
  2414.     ^self restFactor: aTree! !
  2415.  
  2416. !EquationParser methodsFor: 'scanning token'!
  2417.  
  2418. peekToken
  2419.     "peek what is the next token, it will return the token itself"
  2420.  
  2421.     |oldHereChar oldMark oldPrevEnd oldPosition oldToken oldTokenType |
  2422.     oldHereChar _ hereChar.
  2423.     oldMark _ mark.
  2424.     oldPrevEnd _ prevEnd.
  2425.     oldPosition _ source position.
  2426.     oldToken _ token.
  2427.     oldTokenType _ tokenType.
  2428.     self scanToken.
  2429.     nextToken _ token.
  2430.     hereChar _ oldHereChar.
  2431.     mark _ oldMark.
  2432.     prevEnd _ oldPrevEnd.
  2433.     source position: oldPosition.
  2434.     token _ oldToken.
  2435.     tokenType _ oldTokenType.
  2436.     ^nextToken! !
  2437.  
  2438. !EquationParser methodsFor: 'access'!
  2439.  
  2440. name
  2441.     "the name of the equation"
  2442.  
  2443.     ^name!
  2444.  
  2445. name: aName 
  2446.     "set the name of the equation"
  2447.  
  2448.     ^name _ aName!
  2449.  
  2450. requestor
  2451.     ^requestor!
  2452.  
  2453. requestor: aRequestor
  2454.     ^requestor_ aRequestor.!
  2455.  
  2456. scanText: aText 
  2457.     "initialize text"
  2458.  
  2459.     self on: (ReadStream on: aText asString)!
  2460.  
  2461. symbolDictionary: aSymbolDictionary
  2462.  
  2463.     symbolDictionary _ aSymbolDictionary.!
  2464.  
  2465. tokenIsFunction
  2466.     FunctionDictionary at: token asSymbol ifAbsent: [^false].
  2467.     ^true!
  2468.  
  2469. tokenIsSymbol
  2470.     symbolDictionary at: token asSymbol ifAbsent: [^false].
  2471.     ^true.! !
  2472.  
  2473. !EquationParser methodsFor: 'error handling'!
  2474.  
  2475. abort
  2476.     ^nil!
  2477.  
  2478. notify: aString at: location 
  2479.     requestor
  2480.         error: #syntax
  2481.         with: aString
  2482.         at: location.
  2483.     ^self abort! !
  2484.  
  2485. !EquationParser methodsFor: 'checking symbols'!
  2486.  
  2487. checkAllSymbolsUsed: aTree
  2488.     " check whether all the symbols in the symbol dictionary are used
  2489.         in aTree"
  2490.     |aSet|
  2491.     aSet _ Set new.
  2492.     aSet _ aTree findSymbols: aSet.
  2493.     symbolDictionary do: [:anEntity |  (aSet includes: anEntity) ifFalse: [^false]].
  2494.     ^true!
  2495.  
  2496. checkCircularity: aTree 
  2497.     "check whether there is any circularities in the Tree"
  2498.  
  2499.     ^aTree findCircularity: name! !
  2500. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  2501.  
  2502. EquationParser class
  2503.     instanceVariableNames: ''!
  2504.  
  2505.  
  2506. !EquationParser class methodsFor: 'instance creation'!
  2507.  
  2508. on: aText 
  2509.     "build the tree from the text"
  2510.  
  2511.     | anEquationParser |
  2512.     anEquationParser _ EquationParser new.
  2513.     anEquationParser scanText: aText.
  2514.     anEquationParser requestor: EquationParserErrorHandler new.
  2515.     ^anEquationParser! !
  2516.  
  2517. !EquationParser class methodsFor: 'initialization'!
  2518.  
  2519. initializeFunctionDict: aFunctionDictionary 
  2520.     FunctionDictionary _ aFunctionDictionary! !
  2521.  
  2522. !EquationParser class methodsFor: 'examples'!
  2523.  
  2524. anotherExample
  2525.     "EquationParser anotherExample"
  2526.  
  2527.     | aParser aText anEqEditor |
  2528.     EquationEditor initialize.
  2529.     anEqEditor _ EquationEditor new.
  2530.     EquationParser initializeFunctionDict: anEqEditor functionDictionary.
  2531.     aText _ Text fromString: 'mytext _ sin (cos(30))'.
  2532.     aParser _ EquationParser on: aText.
  2533.     aParser name: 'mytext'.
  2534.     ^aParser parse!
  2535.  
  2536. example
  2537.     "EquationParser example"
  2538.     | scanner |
  2539.     scanner _ EquationParser new.
  2540.     scanner on: (ReadStream on: ' _ 67 87').
  2541.     scanner scanToken.
  2542.     "scanner peekToken.
  2543.     scanner scanToken."
  2544.     ^scanner! !
  2545.  
  2546. EquationParser subclass: #InitParser
  2547.     instanceVariableNames: ''
  2548.     classVariableNames: ''
  2549.     poolDictionaries: ''
  2550.     category: 'SDS-Equations'!
  2551. InitParser comment:
  2552. 'I am a subclass of EquationParser. The difference between me and EquationParser is that I am used as a parser for INIT(symbol) equation
  2553. in StockBox.'!
  2554.  
  2555.  
  2556. !InitParser methodsFor: 'parsing text'!
  2557.  
  2558. parse
  2559.     "build a parser tree"
  2560.  
  2561.     | aTree |
  2562.     self scanToken.
  2563.     tokenType == #word ifFalse: [^self notify: 'syntax error:  INIT is expected'].
  2564.     token = 'INIT' ifFalse: [^self notify: 'syntax error: INIT is expected'].
  2565.     self scanToken.
  2566.     tokenType == #leftParenthesis ifFalse: [^self notify: 'syntax error: ( is expected'].
  2567.     self scanToken.
  2568.     tokenType = #word ifFalse: [^self notify: 'syntax error: ' , name asString , ' is expected'].
  2569.     name = token asSymbol ifFalse: [^self notify: 'syntax error: ' , name asString , ' is expected'].
  2570.     self scanToken.
  2571.     tokenType = #rightParenthesis ifFalse: [^self notify: 'syntax error: ) is expected'].
  2572.     self scanToken.
  2573.     tokenType = #leftArrow ifFalse: [^self notify: 'syntax error: _ is expected'].
  2574.     aTree _ self expr.
  2575.     aTree = nil ifTrue: [^nil].
  2576.     (self checkCircularity: aTree)
  2577.         ifTrue: [^self notify: 'Error:  there is a circularity'].
  2578.     self peekToken.
  2579.     nextToken = nil
  2580.         ifTrue: [^aTree]
  2581.         ifFalse: [^self notify: 'syntax error: runaway characters']! !
  2582. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  2583.  
  2584. InitParser class
  2585.     instanceVariableNames: ''!
  2586.  
  2587.  
  2588. !InitParser class methodsFor: 'instance creation'!
  2589.  
  2590. on: aText 
  2591.     "build the tree from the text"
  2592.  
  2593.     | anEquationParser |
  2594.     anEquationParser _ InitParser new.
  2595.     anEquationParser scanText: aText.
  2596.     anEquationParser requestor: EquationParserErrorHandler new.
  2597.     ^anEquationParser! !